// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.search.impl;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.eva.android.widget.BaseFragment;
import com.eva.android.widget.WidgetUtils;
import com.eva.epc.common.util.CommonUtils;
import com.x52im.rbchat.logic.search.content.SearchableContent;
import com.x52im.rbchat.logic.search.model.SearchCompleteData;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.x52im.rbchat.R;

import java.util.List;

/**
 * 搜索功能和搜索结果Fragment实现类。
 *
 * @author JackJiang
 * @since 8.2
 */
public class SearchImplFragment extends BaseFragment {

    /** 搜索结果显示列表 */
    private RecyclerView resultListView;
    /** 没有搜索到数据时要显示的ui布局 */
    private LinearLayout noDataLinearLayout;
    /** 搜索开始前的提示信息显示ui布局 */
    private LinearLayout hintLinearLayout;
    /** 搜索开始前的提示信息组件 */
    private TextView hintTextView;

    /** 搜索结果列表adapter */
    private SearchResultListAdapter resultListAdapter;
    /** 搜索数据源ViewModel实现类 */
    private DataSourceViewModel dataSourceViewModel;

    /**
     * 本方法由父类的 {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} 调用，子类可在此方法中实现ui的初始化。
     *
     * @see #onCreateView(LayoutInflater, ViewGroup, Bundle)
     */
    @Override
    protected View initViews(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) {
        View view = inflater.inflate(R.layout.search_result_fragment, container, false);

        dataSourceViewModel = new ViewModelProvider(this).get(DataSourceViewModel.class);
        dataSourceViewModel.getResultLiveData().observeForever(this::onSearchComplete);

        resultListView = view.findViewById(R.id.search_result_fragment_recyclerView);
        noDataLinearLayout = view.findViewById(R.id.search_result_fragment_nodataLL);
        hintLinearLayout = view.findViewById(R.id.search_result_fragment_descLL);
        hintTextView = view.findViewById(R.id.search_result_fragment_descTextView);

        return view;
    }

    /**
     * 本方法由父类的 {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} 调用，子类可在此方法中实现ui的事件监听器初始化。
     */
    @Override
    protected void initListeners(){
        // 列表滚动时自动隐藏输入法
        resultListView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                WidgetUtils.hideInputMethod(getActivity(), getView());
            }
        });
    }

    /**
     * 开始进行搜索。
     *
     * @param keyword 搜索关键字
     * @param searchableContents 可搜索内容描述对象
     */
    public void doSearch(String keyword, List<SearchableContent> searchableContents) {
        if (resultListAdapter != null) {
            resultListAdapter.clearResult();
        }

        hintLinearLayout.setVisibility(View.GONE);
        dataSourceViewModel.doSearch(keyword, searchableContents);
    }

    /**
     * 搜索完成后的结果回调。
     *
     * @param result 搜索结果数据封装对象
     */
    private void onSearchComplete(SearchCompleteData result) {
        // 如果搜索结果是空的，就显示空数据ui提示布局
        if (result == null || result.getSearchedResults().size() <= 0) {
            resultListView.setVisibility(View.GONE);
            noDataLinearLayout.setVisibility(View.VISIBLE);
            return;
        } else {
            resultListView.setVisibility(View.VISIBLE);
            noDataLinearLayout.setVisibility(View.GONE);
        }

        // 初始化列表
        if (resultListAdapter == null) {
            resultListAdapter = new SearchResultListAdapter(this);
            resultListView.setAdapter(resultListAdapter);
            resultListView.setLayoutManager(new LinearLayoutManager(getActivity()));
        }
        // 将搜索结果设置到列表的adapter中，以便刷新列表ui的显示
        resultListAdapter.addSearchResult(result);
    }

    /**
     * 清除搜索结果的UI显示。
     */
    public void clearResult() {
        // 清除列表ui数据
        if (resultListAdapter != null) {
            resultListAdapter.clearResult();
        }
        // 显示默认的提示信息
        hintLinearLayout.setVisibility(View.VISIBLE);
        // 隐藏无数据时的提示ui
        noDataLinearLayout.setVisibility(View.GONE);
        // 隐藏结果列表
        resultListView.setVisibility(View.GONE);
    }

    /**
     * 更新搜索开始前的信息提示文字。
     *
     * @param hint 提示内容，如果为null则表示隐藏信息提示相关布局的显示，否则更新提示文字
     */
    public void updateHint(String hint){
        if(CommonUtils.isStringEmpty(hint)){
            hintLinearLayout.setVisibility(View.GONE);
        }else{
            hintLinearLayout.setVisibility(View.VISIBLE);
            hintTextView.setText(hint);
        }
    }
}
